﻿using System;
using System.Globalization;

namespace Ukagaka.Named.Ghost.Shiori
{
	/// <summary>
	/// プロトコルを表現します
	/// </summary>
	public class Protocol : IProtocol
	{
		/// <summary>
		/// プロトコルの名前を取得します
		/// </summary>
		public string Name
		{
			get;
			set;
		}

		/// <summary>
		/// プロトコルのバージョンを取得します
		/// </summary>
		public decimal Version
		{
			get;
			set;
		}

		/// <summary>
		/// プロトコルを初期化します
		/// </summary>
		/// <param name="name">プロトコルの名前</param>
		/// <param name="version">プロトコルのバージョン</param>
		public Protocol( string name, decimal version )
		{
			Name = name;
			Version = version;
		}

		/// <summary>
		/// プロトコルを初期化します
		/// </summary>
		/// <param name="protocol">プロトコル</param>
		public Protocol( string protocol )
		{
			Parse( protocol );
		}

		/// <summary>
		/// プロトコルを取得します
		/// </summary>
		/// <returns>プロトコル</returns>
		public override string ToString( )
		{
			return string.Concat( Name, "/", Version.ToString( "0.0", CultureInfo.InvariantCulture ) );
		}

		/// <summary>
		/// プロトコルを解析します
		/// </summary>
		/// <param name="protocol">プロトコル</param>
		public virtual void Parse( string protocol )
		{
			var split = protocol.Split( new char[ ] { '/' }, 2, StringSplitOptions.RemoveEmptyEntries );

			Name = split[ 0 ].Trim( );
			Version = decimal.Parse( split[ 1 ].Trim( ) );
		}
	}

	/// <summary>
	/// プロトコルを表現します
	/// </summary>
	public interface IProtocol : IParseable
	{
		/// <summary>
		/// プロトコルの名前を取得します
		/// </summary>
		string Name
		{
			get;
		}

		/// <summary>
		/// プロトコルのバージョンを取得します
		/// </summary>
		decimal Version
		{
			get;
		}
	}
}
